package com.ruoyi.student.service.impl;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.student.domain.StudentInfo;
import com.ruoyi.student.mapper.StudentInfoMapper;
import com.ruoyi.student.service.IStudentPhotoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

/**
 * 学生照片服务实现类
 * 实现照片上传和学生信息匹配的具体逻辑
 */
@Service
public class StudentPhotoServiceImpl implements IStudentPhotoService {

    private static final Logger log = LoggerFactory.getLogger(StudentPhotoServiceImpl.class);

    @Autowired
    private StudentInfoMapper studentInfoMapper;

    /**
     * 上传学生照片
     * 将照片保存到指定目录，保持原文件名不变
     */
    @Override
    public int uploadPhotos(MultipartFile[] files, String uploadPath) throws Exception {
        int count = 0;

        // 创建上传目录（如果不存在）
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            boolean mkdirs = uploadDir.mkdirs();
            if (!mkdirs) {
                throw new Exception("无法创建上传目录: " + uploadPath);
            }
        }

        // 遍历文件并保存
        for (MultipartFile file : files) {
            if (!file.isEmpty()) {
                // 获取原始文件名（不改变文件名）
                String fileName = file.getOriginalFilename();
                if (StringUtils.isEmpty(fileName)) {
                    continue;
                }

                Path filePath = Paths.get(uploadPath, fileName);

                // 检查文件是否已存在
                if (Files.exists(filePath)) {
                    log.warn("文件已存在，将被覆盖: {}", fileName);
                }

                // 保存文件
                Files.write(filePath, file.getBytes());
                count++;
                log.info("文件上传成功: {}", fileName);
            }
        }

        return count;
    }

    /**
     * 匹配并更新学生照片
     * 根据文件名（学号）匹配学生信息并更新照片路径
     */
    @Override
    public Map<String, Integer> matchAndUpdatePhotos(String photoPath) throws Exception {
        int totalCount = 0;
        int matchedCount = 0;

        // 获取照片目录下的所有文件
        File photoDir = new File(photoPath);
        File[] photoFiles = photoDir.listFiles();

        if (photoFiles != null && photoFiles.length > 0) {
            totalCount = photoFiles.length;

            // 遍历照片文件
            for (File file : photoFiles) {
                if (file.isFile() && isImageFile(file.getName())) {
                    // 从文件名中提取学生学号（假设文件名是学号，如：2023001.jpg）
                    String studentId = getStudentIdFromFileName(file.getName());

                    if (StringUtils.isNotEmpty(studentId)) {
                        // 查询学生信息
                        StudentInfo student = studentInfoMapper.selectStudentInfoListByStudentId(studentId);

                        if (student != null) {
                            // 修改后的相对路径拼接（仅改这一行）
                            student.setStudentPhoto("/profile/student/photos/" + file.getName());

                            int rows = studentInfoMapper.updateStudentInfo(student);
                            if (rows > 0) {
                                matchedCount++;
                                log.info("学生照片匹配成功: 学号={}, 照片={}", studentId, file.getName());
                            }
                        } else {
                            log.warn("未找到对应学生信息: 学号={}, 照片={}", studentId, file.getName());
                        }
                    } else {
                        log.warn("无法从文件名提取学号: {}", file.getName());
                    }
                }
            }
        } else {
            log.warn("照片目录为空或不存在: {}", photoPath);
        }

        // 返回结果
        Map<String, Integer> result = new HashMap<>();
        result.put("totalCount", totalCount);
        result.put("matchedCount", matchedCount);
        return result;
    }

    /**
     * 判断是否为图片文件
     * @param fileName 文件名
     * @return 是否为图片
     */
    private boolean isImageFile(String fileName) {
        String[] imageExtensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"};
        String lowerFileName = fileName.toLowerCase();

        for (String ext : imageExtensions) {
            if (lowerFileName.endsWith(ext)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 从文件名中提取学生ID（学号）
     * 假设文件名格式是 学生ID.扩展名，例如 2023001.jpg
     * @param fileName 文件名
     * @return 学生ID
     */
// 从文件名中提取学生学号（去除所有空格，尤其是末尾空格）
    private String getStudentIdFromFileName(String fileName) {
        // 1. 先移除文件名中所有空格（包括中间和末尾的）
        String noSpaceFileName = fileName.replaceAll("\\s", "");

        // 2. 再提取学号（假设格式为 "学号.扩展名"）
        int dotIndex = noSpaceFileName.lastIndexOf(".");
        if (dotIndex > 0) {
            return noSpaceFileName.substring(0, dotIndex);
        }
        return noSpaceFileName;
    }
}

